const express = require('express')
// 创建web服务器
const app = express()
// 这个模块提供的parse()函数，可以将查询字符串，解析成对象的格式
const qs = require('querystring')
/**
 * 自定义中间件来解析表单请求数据
 */
app.use((req, res, next) => {
    // 用于存储客户端发送过来的请求体
    let str = ''
    // 监听req的data时间
    // 在中间件中，需要监听req对象的data事件，来获取客户端发发送到服务器的数据
    // 如果数据量比较大，无法一次性发送完毕，则客户端会把数据切割后，分批发送到服务器。所以data事件可能会出发多次
    // 每一次触发data事件，都会获取完整数据的一部分，需要手动接收到的数据进行拼接
    req.on('data', (chunk) => {
        console.log('chunk', chunk);
        str += chunk
    })
    // 监听end事件
    // 请求体数据接受完毕后，会自动触发req的end事件
    req.on('end', () => {
        // 请求体数据 name=czk&age=20
        console.log('请求体数据', str)
        if (str) {
            const obj = qs.parse(str)
            // obj==== {name: 'czk', age: '20'} 转为对象
            console.log('obj====', obj)
            // 挂载在body里面
            req.body=obj
        }
        // 数据组装完后，再进行放行
        next()
    })
    
})


app.post('/test', function (req, res) {
    // req.body undefined 没有配置中间件时是undifine
    // 配置json获取请求体的中间件才能获取请求体的数据
    console.log("req.body", req.body);
    res.send('ok')
})

/**
 * 定义错误级别的中间件
 * 捕获错误
 * 错误级别的中间件定在后面
 */
app.use((err, req, res, next) => {
    console.log('服服务器发生了错误====');
    res.send('===========出错了=======' + err.message)
})


// 启动服务器
app.listen(8080, () => {
    console.log('express server running at http://127.0.0.1');
})
